package com.jacklei.ch10;

import java.util.Arrays;

/*
* 给定一个经过编码的字符串，返回它解码后的字符串。

编码规则为: k[encoded_string]，表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。

此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 k ，例如不会出现像 3a 或 2[4] 的输入。

 

示例 1：

输入：s = "3[a]2[bc]"
输出："aaabcbc"
示例 2：

输入：s = "3[a2[c]]"
输出："accaccacc"
示例 3：

输入：s = "2[abc]3[cd]ef"
输出："abcabccdcdcdef"
示例 4：

输入：s = "abc3[cd]xyz"
输出："abccdcdcdxyz"
 

提示：

1 <= s.length <= 30
s 由小写英文字母、数字和方括号 '[]' 组成
s 保证是一个 有效 的输入。
s 中所有整数的取值范围为 [1, 300] 

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/decode-string
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。*/
public class DecodeString {
    public static void main(String[] args) {
        DecodeString d = new DecodeString();
        System.out.println(d.decodeString("100[leetcode]"));
    }
    public String decodeString(String s) {
        StringBuilder builder = new StringBuilder();
        int p = 0;
        while (p < s.length()) {
            if (s.charAt(p) - '0' >= 0 && s.charAt(p) - '0' <= 9) {
                String num = ""+s.charAt(p++);
                while (s.charAt(p) - '0' >= 0 && s.charAt(p) - '0' <= 9){
                    num +=s.charAt(p++);
                }
                int N = Integer.valueOf(num);
                p++;
                String temp = "";
                int flat = 1;
                while (p < s.length() && !(s.charAt(p) == ']' && flat == 1)) {
                    if(s.charAt(p) == '[') flat ++;
                    if(s.charAt(p) == ']') flat --;
                    temp += s.charAt(p++);
                }
                for (int i = 0; i < N; i++) {
                    builder.append(decodeString(temp));
                }

            } else {
                builder.append(s.charAt(p));
            }
            p++;

        }
    return builder.toString();
    }
}

